home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
utils
/
tweak16b
/
regtable.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1993-11-27
|
3KB
|
124 lines
/*
RegTable.CPP version 1.0
by Robert Schmidt of Ztiff Zox Softwear 1993
Defines the member and friend functions of the RegisterTable class
declared in RegTable.HPP.
*/
#include <dos.h>
//#include <conio.h>
#include "RegTable.hpp"
RegisterTable::RegisterTable(istream &ins)
{
// Read number of registers (first number in file)
ins >> registers;
// Allocate enough space
reg = new NamedRegister[registers];
// Read reg. descriptions
for (int i=0; i<registers; i++)
ins >> reg[i];
// Get current register configuration from VGA, and use as default
in();
}
void RegisterTable::in()
{
for (int r = 0; r < registers; r++)
reg[r].in();
}
void RegisterTable::out()
{
outportb(0x3d4,0x11); // Ensure CRT regs. 0-7 are writable!
int v = inportb(0x3d5); // That is, clear bit 7 of port
v &= 0x7f; // 0x3D4, index 0x11.
outport(0x3d4,0x11 | (v << 8));
// outport(0x3c4, 0x0100); // reset sequencer
for (int r = 0; r < registers; r++)
if (reg[r].isEnabled())
reg[r].out();
// outport(0x3c4, 0x0300); // re-reset sequencer
outportb(0x3c0, 0x20); // Reenable display data
}
/*
This istream operator >> reads an entire table of Register values
into 'this' table.
Notes:
The stream is read until good() is no longer true. Not good
practice, but hey!
If the read Register's port and index pair is not found in 'this'
table, it is ignored.
In effect, only the *values* in the table may change after >>,
not port or index numbers.
*/
istream& operator>> (istream &in, RegisterTable &t)
{
int r = 0;
t.doDisable(); // first disable all registers
while (in.good())
{
Register temp;
in >> temp;
int prevr = r;
//Search for the correct register position:
while (temp.getPort() != t.reg[r].getPort() ||
temp.getIndex() != t.reg[r].getIndex())
{
if (++r >= t.registers)
r = 0;
if (r == prevr) // Have we looped around once?
goto skip; // Register not supported!
}
// Correct register found, now store the value and enable it.
t.reg[r].setValue(temp.getValue());
t.reg[r].doEnable(); // enable this single register
skip:
}
return in;
}
// This operator << sends all enabled registers in t to the out stream.
ostream& operator<< (ostream &out, RegisterTable &t)
{
for (int r = 0; r < t.registers; r++)
if (t.reg[r].isEnabled())
out << Register(t.reg[r]);
return out;
}
void RegisterTable::doEnable()
{
for (int r=0; r<registers; r++)
reg[r].doEnable();
}
void RegisterTable::doDisable()
{
for (int r=0; r<registers; r++)
reg[r].doDisable();
}
Register *RegisterTable::getRegister(unsigned p, unsigned char i)
{
for (int r = 0; r < registers; ++r)
if (reg[r].getPort() == p && reg[r].getIndex() == i)
return ®[r];
return 0;
}